home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / mp / mp_divul3_word.c < prev    next >
Text File  |  1991-06-12  |  1KB  |  58 lines

  1. typedef unsigned long ulong;
  2.  
  3. ulong
  4. divul3(x,y,hi)
  5.      ulong x,y,*hi;
  6. {
  7. #define HIBIT 0x80000000
  8. #define HIMASK 0xffff0000
  9. #define LOMASK 0xffff
  10. #define HIWORD(a) (a >> 16)
  11. /* si le compilateur est bugge, il faut mettre (a >> 16) & LOMASK) */
  12. #define LOWORD(a) (a & LOMASK)
  13. #define GLUE(hi, lo) ((hi << 16) + lo)
  14. #define SPLIT(a, b, c) b = HIWORD(a); c = LOWORD(a)
  15.  
  16.     ulong v1, v2, u3, u4, q1, q2, aux, aux1, aux2,hiremainder=*hi;
  17.     int k;
  18.     
  19.     for(k = 0; !(y & HIBIT); k++)
  20.         {
  21.             hiremainder <<= 1;
  22.             if (x & HIBIT) hiremainder++;
  23.             x <<= 1;
  24.             y <<= 1;
  25.         }
  26.         
  27.     SPLIT(y, v1, v2);
  28.     SPLIT(x, u3, u4);
  29.     
  30.     q1 = hiremainder / v1; if (q1 & HIMASK) q1 = LOMASK;
  31.     hiremainder -= q1 * v1;
  32.     aux = v2 * q1;
  33. again:
  34.     SPLIT(aux, aux1, aux2);
  35.     if (aux2 > u3) aux1++;
  36.     if (aux1 > hiremainder) {q1--; hiremainder += v1; aux -= v2; goto again;}
  37.     u3 -= aux2;
  38.     hiremainder -= aux1;
  39.     hiremainder <<= 16; hiremainder += u3 & LOMASK;
  40.     
  41.     q2 = hiremainder / v1; if (q2 & HIMASK) q2 = LOMASK;
  42.     hiremainder -= q2 * v1;
  43.     aux = v2 * q2;
  44. again2:
  45.     SPLIT(aux, aux1, aux2);
  46.     if (aux2 > u4) aux1++;
  47.     if (aux1 > hiremainder) {q2--; hiremainder += v1; aux -= v2; goto again2;}
  48.     u4 -= aux2;
  49.     hiremainder -= aux1;
  50.     hiremainder <<= 16; hiremainder += u4 & LOMASK;
  51.     hiremainder >>= k;
  52.     *hi = hiremainder;
  53.     return GLUE(q1, q2);
  54. }
  55.  
  56.  
  57.  
  58.